/**
 * 
 */
package com.monkeyboy.security.dto;

import java.util.Date;

import javax.validation.constraints.Past;

import org.hibernate.validator.constraints.NotBlank;

import com.fasterxml.jackson.annotation.JsonView;
import com.monkeyboy.security.validator.MyValidator;

/**
 * @Description
 *
 * @author Gavin<br>
 *         2019年8月24日
 */
public class User {
	/**
	 * @Description 常用校验注解，Hibernate Validator
	 * 
	 *              <pre>
	 *	 {@code
	 *		&#64;NotNull:值不能为空,
	 *		&#64;Null: 值必须为空,
	 *		&#64;Pattern(regex=):字符串必须匹配正则表达式,
	 *		&#64;Size(min=,max=): 集合元素数量必须在min和max之间,
	 *		&#64;CreditCardNumber(ignoreNonDigitCharacters=):字符串必须是信用卡号（按美国的标准校验）,
	 *		&#64;Email:email地址格式,
	 *		&#64;Length(min=,max=):检查字符串的长度,
	 *		&#64;NotBlank:字符串不能为空,
	 *		&#64;Range(min=,max=):数字必须大于等于min，小于等于max,
	 *		&#64;SafeHtml:字符串是安全的html,
	 *		&#64;Url: 字符串必须是合法的URL,
	 *		&#64;AssertFalse:值必须是false,
	 *		&#64;AssertTrue:值必须是true,
	 *		&#64;DecimalMax(value=,inclusive=):值必须小于等于（inclusive=true）/小于（inclusive=false）value属性指定的值。可以注解在字符串类型的属性上,
	 *      &#64;DecimalMin(value=,inclusive=):值必须大于等于（inclusive=true）/小于（inclusive=false）value属性指定的值。可以注解在字符串类型的属性上
	 *      &#64;Digits(integer=,fraction=):数字格式检查，integer指定整数部分的最大长度，fraction指定小数部分的最大长度,
	 *      &#64;Future: 值必须是未来的日期,
	 *      &#64;Past:值必须是过去的日期,
	 *      &#64;Max(value=):值必须小于等于value指定的值。不能注解在字符串类型的属性上,
	 *      &#64;Min(value=): 值必须大于等于value指定的值。不能注解在字符串类型的属性上,
	 *	 }
	 *              </pre>
	 * 
	 * @author Gavin<br>
	 *         2019年8月24日
	 */
	// 该jsonview视图不返回密码
	public interface UserSimpleView {
	};

	// 由于继承关系，该视图会返回UserSimpleView+UserDetailView两个视图的数据
	public interface UserDetailView extends UserSimpleView {
	};

	private String id;
	@MyValidator(message = "这是一个自定义校验注解")
	private String username;
	@NotBlank(message = "密码不能为空")
	private String password;
	@Past // 生日必须是在以前的时间
	private Date birthday;// 由于前后台分离的思想，日期最好存一个时间戳，显示的格式交给前台去控制。

	@JsonView(UserSimpleView.class)
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@JsonView(UserSimpleView.class)
	public Date getBirthday() {
		return birthday;
	}

	public void setBirthDay(Date birthday) {
		this.birthday = birthday;
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public User() {
	}

	@JsonView(UserSimpleView.class) // 指定返回用户名时候的视图
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@JsonView(UserDetailView.class) // 指定返回密码时候的视图
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
